home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / taskswitch.c < prev    next >
C/C++ Source or Header  |  2004-01-12  |  5KB  |  198 lines

  1. /*-------------------------------------------------------------
  2.   taskswitch.c : customize task switcher
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10. #include "newapi.h"
  11.  
  12. /* Globals */
  13.  
  14. void InitTaskSwitch(HWND hwndClock);
  15. void EndTaskSwitch(void);
  16.  
  17. /* Statics */
  18.  
  19. static LRESULT CALLBACK WndProcTab(HWND, UINT, WPARAM, LPARAM);
  20.  
  21. static BOOL    m_bTaskSwitchFlat = FALSE;
  22. static BOOL    m_bTaskSwitchIcons = FALSE;
  23. static BOOL    m_bSeparator = FALSE;
  24. static HWND    m_hwndTab = NULL;
  25. static LONG    m_oldStyle;
  26. static DWORD   m_oldExStyle;
  27. // static DWORD   m_oldTBStyle;
  28. static LONG    m_oldTaskWidth;
  29. static WNDPROC m_oldWndProcTab = NULL;
  30.  
  31. /*--------------------------------------------------
  32.    initialize
  33. ----------------------------------------------------*/
  34. void InitTaskSwitch(HWND hwndClock)
  35. {
  36.     HANDLE hwndTaskbar, hwndRebar, hwndSwitch;
  37.     
  38.     if(!g_bIE4) return;
  39.     
  40.     EndTaskSwitch();
  41.     
  42.     if(!g_bVisualStyle)
  43.     {
  44.         m_bTaskSwitchFlat = GetMyRegLong(NULL, "TaskSwitchFlat", FALSE);
  45.         if(!(g_winver&WINXP) && m_bTaskSwitchFlat)
  46.             m_bSeparator = GetMyRegLong(NULL, "TaskSwitchSeparators", FALSE);
  47.     }
  48.     
  49.     // Icons Only: not to support Windows XP
  50.     if(!(g_winver&WINXP))
  51.         m_bTaskSwitchIcons = GetMyRegLong(NULL, "TaskSwitchIconsOnly", FALSE);
  52.     
  53.     if(!m_bTaskSwitchFlat && !m_bTaskSwitchIcons)
  54.         return;
  55.     
  56.     // get window handle of MSTaskSwWClass
  57.     hwndTaskbar = GetParent(GetParent(hwndClock));
  58.     hwndRebar = FindWindowEx(hwndTaskbar, NULL, "ReBarWindow32", NULL);
  59.     hwndSwitch = FindWindowEx(hwndRebar ? hwndRebar : hwndTaskbar,
  60.         NULL, "MSTaskSwWClass", NULL);
  61.     if(hwndSwitch == NULL) return;
  62.     
  63.     m_hwndTab = GetWindow(hwndSwitch, GW_CHILD);
  64.     if(m_hwndTab == NULL) return;
  65.     
  66.     if(!(g_winver&WINXP) && IsSubclassed(m_hwndTab))
  67.     {
  68.         m_hwndTab = NULL; return;
  69.     }
  70.     
  71.     if(m_bTaskSwitchFlat)
  72.     {
  73.         m_oldStyle = GetWindowLong(m_hwndTab, GWL_STYLE);
  74.         
  75.         if(g_winver&WINXP)
  76.         {
  77.             // m_hwndTab is Toolbar control
  78.             SetWindowLong(m_hwndTab, GWL_STYLE, m_oldStyle|TBSTYLE_FLAT);
  79.         }
  80.         else
  81.         {
  82.             // m_hwndTab is Tab control
  83.             SetWindowLong(m_hwndTab, GWL_STYLE,
  84.                 m_oldStyle|TCS_FLATBUTTONS|TCS_HOTTRACK);
  85.         }
  86.         
  87.         if(m_bSeparator)
  88.         {
  89.             m_oldExStyle = TabCtrl_GetExtendedStyle(m_hwndTab);
  90.             TabCtrl_SetExtendedStyle(m_hwndTab,
  91.                 m_oldExStyle|TCS_EX_FLATSEPARATORS);
  92.         }
  93.     }
  94.     
  95.     if(m_bTaskSwitchIcons)
  96.     {
  97.         /*if(g_winver&WINXP)
  98.         {
  99.             m_oldTBStyle = SendMessage(m_hwndTab, TB_GETEXTENDEDSTYLE, 0, 0);
  100.             SendMessage(m_hwndTab, TB_SETEXTENDEDSTYLE,
  101.                 0, m_oldTBStyle|TBSTYLE_EX_MIXEDBUTTONS);
  102.         }
  103.         else
  104.         {*/
  105.             m_oldTaskWidth = SendMessage(m_hwndTab, TCM_SETITEMSIZE,
  106.                 0, 23 + (23<<16));
  107.             m_oldTaskWidth = LOWORD(m_oldTaskWidth);
  108.         /*}*/
  109.     }
  110.     
  111.     m_oldWndProcTab = (WNDPROC)GetWindowLong(m_hwndTab, GWL_WNDPROC);
  112.     SetWindowLong(m_hwndTab, GWL_WNDPROC, (LONG)WndProcTab);
  113.     
  114.     PostMessage(m_hwndTab, WM_SIZE, SIZE_RESTORED, 0);
  115. }
  116.  
  117. /*--------------------------------------------------
  118.     undo
  119. ----------------------------------------------------*/
  120. void EndTaskSwitch(void)
  121. {
  122.     if(!g_bIE4) return;
  123.     
  124.     if(!m_hwndTab || !IsWindow(m_hwndTab)) return;
  125.     
  126.     if(m_oldWndProcTab)
  127.         SetWindowLong(m_hwndTab, GWL_WNDPROC, (LONG)m_oldWndProcTab);
  128.     m_oldWndProcTab = NULL;
  129.     
  130.     if(m_bTaskSwitchFlat)
  131.         SetWindowLong(m_hwndTab, GWL_STYLE, m_oldStyle);
  132.     
  133.     if(m_bSeparator)
  134.         TabCtrl_SetExtendedStyle(m_hwndTab, m_oldExStyle);
  135.     
  136.     if(m_bTaskSwitchIcons)
  137.     {
  138.         /*if(g_winver&WINXP)
  139.             SendMessage(m_hwndTab, TB_SETEXTENDEDSTYLE, 0, m_oldTBStyle);
  140.         else*/
  141.             SendMessage(m_hwndTab, TCM_SETITEMSIZE, 0,
  142.                 m_oldTaskWidth + (23<<16));
  143.     }
  144.     
  145.     PostMessage(m_hwndTab, WM_SIZE, SIZE_RESTORED, 0);
  146.     
  147.     m_hwndTab = NULL;
  148.     m_bTaskSwitchFlat = m_bSeparator = m_bTaskSwitchIcons = FALSE;
  149. }
  150.  
  151. /*---------------------------------------------------------
  152.    subclass procedure of SysTabControl32/ToobarWindow32
  153. -----------------------------------------------------------*/
  154. LRESULT CALLBACK WndProcTab(HWND hwnd, UINT message,
  155.     WPARAM wParam, LPARAM lParam)
  156. {
  157.     switch(message)
  158.     {
  159.         case TCM_SETITEMSIZE:
  160.             if(m_bTaskSwitchIcons)
  161.             {
  162.                 lParam = 23 + (HIWORD(lParam)<<16);
  163.             }
  164.             else
  165.             {
  166.                 if(LOWORD(lParam)-8 >= 22)
  167.                     lParam = LOWORD(lParam)-8 + (HIWORD(lParam)<<16);
  168.             }
  169.             break;
  170.         case TCM_INSERTITEM:
  171.             PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
  172.             break;
  173.         case TCM_DELETEITEM:
  174.             PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
  175.             break;
  176.         /*
  177.         case TB_SETBUTTONSIZE:
  178.             if(m_bTaskSwitchIcons)
  179.             {
  180.                 lParam = 23 + (HIWORD(lParam)<<16);
  181.             }
  182.             else
  183.             {
  184.                 if(LOWORD(lParam)-8 >= 22)
  185.                     lParam = LOWORD(lParam)-8 + (HIWORD(lParam)<<16);
  186.             }
  187.             break;
  188.         case TB_INSERTBUTTON:
  189.             PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
  190.             break;
  191.         case TB_DELETEBUTTON:
  192.             PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
  193.             break;
  194.         */
  195.     }
  196.     return CallWindowProc(m_oldWndProcTab, hwnd, message, wParam, lParam);
  197. }
  198.